﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CANO.Data.DAOs
{
	public class CompromisoDAO
	{
		public int CompromisoID { get; set; }
		public int TipoCompromiso { get; set; }
		public DateTime FechaCompromiso { get; set; }
		public int UsuarioResponsable { get; set; }
		public int ContactoAsociado { get; set; }
		public int Estado { get; set; }
		public string TipoCompromisoDisplay { get; set; }
		public string ContactoAsociadoDisplay { get; set; }
		public List<UsuarioDAO> CompartidoCon { get; set; }
		public string FechaCompromisoDisplay { get; set; }
		public int ContactoAsociado2 { get; set; }
		public string ContactoAsociado2Display { get; set; }


        private CompromisoDAO FillDAO(Compromiso Compromiso)
        {
            CompromisoDAO compromisoReturn = new CompromisoDAO();
            compromisoReturn.CompromisoID = Compromiso.CompromisoID;

            if (Compromiso.Contacto.HasValue)
                compromisoReturn.ContactoAsociado = Compromiso.Contacto.Value;

            if (Compromiso.Estado.HasValue)
                compromisoReturn.Estado = Compromiso.Estado.Value;

            compromisoReturn.FechaCompromiso = Compromiso.FechaCompromiso;
            compromisoReturn.TipoCompromiso = Compromiso.TipoCompromiso;
            compromisoReturn.TipoCompromisoDisplay = Compromiso.TipoCompromiso1.TipoCompromiso1;
            compromisoReturn.UsuarioResponsable = Compromiso.Usuario;
            //			compromisoReturn.ContactoAsociadoDisplay = Compromiso.Contactos.Nombre + " " + Compromiso.Contactos.Apellido;
            compromisoReturn.ContactoAsociadoDisplay = ContactoDAO.getContact(Compromiso.Contacto.Value.ToString()).FullName;
            
            if(Compromiso.Contacto2.HasValue)
                compromisoReturn.ContactoAsociado2Display = ContactoDAO.getContact(Compromiso.Contacto2.Value.ToString()).FullName;


            compromisoReturn.CompartidoCon = this.GetUsersByCompromisoID(Compromiso.CompromisoID, Compromiso.TipoCompromiso);
            compromisoReturn.FechaCompromisoDisplay = Compromiso.FechaCompromiso.ToShortDateString() + " " + Compromiso.FechaCompromiso.ToShortTimeString();
            if (Compromiso.Contacto2.HasValue)
                compromisoReturn.ContactoAsociado2 = Compromiso.Contacto2.Value;

            return compromisoReturn;
        }

		public int Create()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				Compromiso newCompromiso = new Compromiso();
				newCompromiso.TipoCompromiso = this.TipoCompromiso;
				newCompromiso.FechaCompromiso = this.FechaCompromiso;
				newCompromiso.Usuario = this.UsuarioResponsable;
				newCompromiso.Contacto = this.ContactoAsociado;
				newCompromiso.Estado = this.Estado;
                if(this.ContactoAsociado2 > 0)
				    newCompromiso.Contacto2 = this.ContactoAsociado2;

				context.Compromisos.InsertOnSubmit(newCompromiso);
				context.SubmitChanges();

				return newCompromiso.CompromisoID;
			}
		}

        public static void Delete(int CompromisoId)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                var compromiso =
                   (from e in context.Compromisos
                    where e.CompromisoID == CompromisoId
                    select e).Single();

                compromiso.Estado = 2; //Delete

                context.SubmitChanges();
            }
        }

        //delete => estado = 2  ... 1 new
		public void Compartir(int UserID, int CompromisoID, int Tipo)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				if (Tipo == 2)
				{
					context.EntrevistaCompartidas.InsertOnSubmit(new EntrevistaCompartida()
					{
						EntrevistaID = CompromisoID,
						UsuarioCompartido = UserID
					});
					context.SubmitChanges();
				}
				else
				{
					context.CompromisoCompartidos.InsertOnSubmit(new CompromisoCompartido()
					{
						CompromisoID = CompromisoID,
						UsuarioCompartido = UserID
					});
					context.SubmitChanges();
				}
			}
		}

		public void Update()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var compromiso =
					(from c in context.Compromisos
					 where c.CompromisoID == this.CompromisoID
					 select c).Single();

				compromiso.TipoCompromiso = this.TipoCompromiso;
				compromiso.FechaCompromiso = this.FechaCompromiso;
				compromiso.Contacto = this.ContactoAsociado;
				if (this.ContactoAsociado2 == 0)
					compromiso.Contacto2 = 1;
				else
					compromiso.Contacto2 = this.ContactoAsociado2;
				
				context.SubmitChanges();
			}
		}

		internal List<CompromisoDAO> GetCurrentWeekManager()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<CompromisoDAO> ListCompromiso = new List<CompromisoDAO>();

				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(6);

                //var compromisos =
                //    from e in context.Compromisos
                //    where (e.FechaCompromiso >= stratDay && e.FechaCompromiso <= endDay) && e.Estado == 1
                //    orderby e.FechaCompromiso ascending
                //    select e;

                var compromisos = context.sp_getCompromisosCurrentWeekGerencial();

				foreach (var item in compromisos)
				{
					CompromisoDAO compromiso = new CompromisoDAO();
					compromiso.CompromisoID = item.CompromisoID;
					compromiso.ContactoAsociado = item.Contacto.Value;
					compromiso.Estado = item.Estado.Value;
					compromiso.FechaCompromiso = item.FechaCompromiso;
					compromiso.TipoCompromiso = item.TipoCompromiso;
					compromiso.UsuarioResponsable = item.Usuario;
					compromiso.CompartidoCon = this.GetUsersByCompromisoID(item.CompromisoID, item.TipoCompromiso);
					compromiso.ContactoAsociado2 = this.ContactoAsociado2;
					if (item.Contacto != null)
						compromiso.ContactoAsociadoDisplay = ContactoDAO.getContact(item.Contacto.Value.ToString()).FullName;
					if(item.Contacto2 != null)
						compromiso.ContactoAsociado2Display = ContactoDAO.getContact(item.Contacto2.Value.ToString()).FullName;
					ListCompromiso.Add(compromiso);
				}

				return ListCompromiso;
			}
		}

        internal List<CompromisoDAO> GetCurrentWeekByUser(int CurrentUserID)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                List<CompromisoDAO> ListCompromiso = new List<CompromisoDAO>();

                DateTime currentDay = DateTime.Now.Date;
                DateTime stratDay = currentDay;
                DateTime endDay = currentDay.AddDays(6);

                //var compromisos =
                //    from e in context.Compromisos
                //    where e.Usuario == CurrentUserID && e.Estado == 1
                //    orderby e.FechaCompromiso ascending
                //    select e;

                var compromisos = context.sp_getCompromisosCurrentWeekByUserId(CurrentUserID);

                foreach (var item in compromisos)
                {
                    CompromisoDAO compromiso = new CompromisoDAO();
                    compromiso.CompromisoID = item.CompromisoID;
                    compromiso.ContactoAsociado = item.Contacto.Value;
                    compromiso.Estado = item.Estado.Value;
                    compromiso.FechaCompromiso = item.FechaCompromiso;
                    compromiso.TipoCompromiso = item.TipoCompromiso;
                    compromiso.UsuarioResponsable = item.Usuario;
                    if (item.Contacto2.HasValue)
                        compromiso.ContactoAsociado2 = item.Contacto2.Value;
                    compromiso.CompartidoCon = this.GetUsersByCompromisoID(item.CompromisoID, item.TipoCompromiso);
                    compromiso.ContactoAsociadoDisplay = ContactoDAO.getContact(item.Contacto.Value.ToString()).FullName;
                    if (item.Contacto2.HasValue)
                        compromiso.ContactoAsociado2Display = ContactoDAO.getContact(item.Contacto2.Value.ToString()).FullName;
                    ListCompromiso.Add(compromiso);
                }


                return ListCompromiso;
            }
        }


		public CompromisoDAO GetCompromisoByID(int CompromisoID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{

				var compromisos =
					from e in context.Compromisos
                    where e.CompromisoID == CompromisoID && e.Estado == 1
					select e;

				var comp = compromisos.SingleOrDefault();
				
					//CompromisoDAO compromiso = new CompromisoDAO();
					//compromiso.CompromisoID = comp.CompromisoID;
					//compromiso.ContactoAsociado = comp.Contacto.Value;
					//compromiso.Estado = comp.Estado.Value;
					//compromiso.FechaCompromiso = comp.FechaCompromiso;
					//compromiso.TipoCompromiso = comp.TipoCompromiso;
					//compromiso.UsuarioResponsable = comp.Usuario;
					//compromiso.TipoCompromisoDisplay = comp.TipoCompromiso1.TipoCompromiso1;

					return FillDAO(comp);
			}
		}

		public List<CompromisoDAO> GetAllByContact(int Contact)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<CompromisoDAO> listCompromisos = new List<CompromisoDAO>();

				var compromisos =
					from e in context.Compromisos
                    where e.Contacto == Contact && e.FechaCompromiso > DateTime.Now && e.Estado == 1
					select e;

					foreach (var item in compromisos)
					{
						listCompromisos.Add( FillDAO(item) );
					}
					return listCompromisos;
				}
		}


        public List<UsuarioDAO> GetUsersByCompromisoID(int CompromisoID, int Type)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                List<UsuarioDAO> listUser = new List<UsuarioDAO>();
                if (Type == 2)
                {
                    var entrevistas =
                        from e in context.Entrevistas
                        join cc in context.EntrevistaCompartidas on e.EntrevistaID equals cc.EntrevistaID
                        where (e.EntrevistaID == CompromisoID || cc.EntrevistaID == CompromisoID) && e.Status == null
                        select new { e, cc };

                    foreach (var item in entrevistas)
                    {
                        if (item.cc.UsuarioCompartido != null)
                            listUser.Add(new UsuarioDAO().getUser(item.cc.UsuarioCompartido));
                        else
                            listUser.Add(new UsuarioDAO().getUser(item.e.Usuario.Value));
                    }
                }
                else
                {
                    var compromisos =
                        from e in context.Compromisos
                        join cc in context.CompromisoCompartidos on e.CompromisoID equals cc.CompromisoID
                        where (e.CompromisoID == CompromisoID || cc.CompromisoID == CompromisoID) && e.Estado == 1
                        select new { e, cc };

                    foreach (var item in compromisos)
                    {
                        if (item.cc.Usuario != null)
                            listUser.Add(new UsuarioDAO().getUser(item.cc.Usuario.UsuarioID));
                        else
                            listUser.Add(new UsuarioDAO().getUser(item.e.Usuario));
                    }
                }

                return listUser;
            }
        }


	}
}
